package com.haoke.recommendation.service.impl;

import com.haoke.commons.vo.HaokeResult;
import com.haoke.pojo.Item;
import com.haoke.recommendation.dao.ItemDao;
import com.haoke.recommendation.service.RecommendationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * 热门推荐 服务实现
 * <p>
 * 查询条件：城市=方法参数 and 是否推荐 = true
 */
@Service
public class RecommendationImpl implements RecommendationService {

    @Autowired
    private ItemDao itemDao;
    @Value("${haoke.banner.nginx.prefix}")
    private String nginxPrefix;


    @Override
    public HaokeResult getRecommendation(String city) {
        //查询条件
        Query query = new Query();
        //创建条件查询对象
        Criteria criteria = new Criteria();
        //用条件查询对象 去实现多条件查询  条件：城市 = 参数值 and 是否推荐 = true
        criteria.andOperator(
                //查询条件是否为 城市city
                Criteria.where("city").is(city),
                //查询条件是否为 推荐true
                Criteria.where("recommendation").is(true)
        );
        System.out.println("推荐查询城市"+city);
        //上面的查询条件 添加到查询query
        query.addCriteria(criteria);
        //分页条件查询 显示4条数据，降序排列，根据recoSort字段的权重 进行排列
        query.with(PageRequest.of(0, 4, Sort.by(Sort.Direction.DESC, "recoSort")));
        //查询结果接收
        List<Item> itemList = itemDao.selectRecommendation(query);

        //判断查询结果数量是否达标
        if (itemList.size() < 4) {
            //查询的热门推荐商品数量少于4，从其他城市的推荐商品中查询
            Query otherQuery = new Query();
            Criteria otherCriteria = new Criteria();
            otherCriteria.andOperator(
                    //不能有重复字段city
                    Criteria.where("city").ne(city),
                    Criteria.where("recommendation").is(true)
            );
            otherQuery.addCriteria(otherCriteria);
            otherQuery.with(PageRequest.of(0, 4 - itemList.size(), Sort.by(Sort.Direction.DESC, "recoSort")));
            List<Item> otherItems = itemDao.selectRecommendation(otherQuery);
            itemList.addAll(otherItems);
        }


        //所有城市热门推荐数据总量少于4条，使用托底数据
        if (itemList.size() < 4) {
            for (int i = itemList.size(); i < 4; i++) {
                //添加托底数据
                itemList.add(fallBackItem());
            }

        }
        //把图片URL地址，转换成完整路径
        itemList = this.changeImgsUrl(itemList);

        //返回结果 从HaokeResult中调取data返回结果
        return HaokeResult.ok(itemList);
    }

    /**
     * 图片地址处理方法  相对路径转换成绝对路径
     * 将集合中的每个Item类型对象的图片地址，增加前缀
     *
     * @param items
     * @return
     */
    //
    private List<Item> changeImgsUrl(List<Item> items) {
        for (Item item : items) {
            List<String> newImgs = new ArrayList<>();
            for (String img : item.getImgs()) {
                newImgs.add(nginxPrefix + img);
            }
            item.setImgs(newImgs);
        }
        return items;
    }


    /**
     * 创建托底数据生成
     *
     * @return
     */
    private Item fallBackItem() {
        Item item = new Item();
        item.setId("6216363d9ba8811e82099414");
        item.setCity("北京");
        item.setHouseType("150 ㎡");
        item.setImgs(
                Arrays.asList(
                        "group1/M00/00/00/wKiIgmITgKKAE-DYABLGy4zg5nA023_big.png",
                        "group1/M00/00/00/wKiIgmITgOyAUmwVAAjIobLVxBY138_big.png",
                        "group1/M00/00/00/wKiIgmITgP2AXX3bAAro9yfjOVw344_big.png"
                )
        );
        item.setPrice(12000L);
        item.setRecommendation(true);
        item.setRecoSort((byte) 9);
        item.setRentType("整租");
        item.setSales(100L);
        item.setTitle("北京高档公寓");
        Map<String, String> info = new HashMap<>();
        info.put("years", "2010");
        info.put("type", "3室2厅");
        info.put("level", "10/18层");
        info.put("style", "精装修");
        info.put("orientation", "南北通透");
        item.setInfo(info);

        return item;
    }
}
